﻿using System;
using System.Net;
using System.Net.Mail;
using System.Web.Mvc;
using CodeSaude.Application.Interfaces;
using CodeSaude.Application.ViewModels;
using CodeSaude.Infrastructure.CrossCutting.IoC.Provider.Abstract;
using CodeSaude.Infrastructure.CrossCutting.Util;

namespace CodeSaude.Web.Controllers
{
    public class AutenticacaoController : Controller
    {
        private readonly IAutenticacaoProvider _autenticacaoProvider;
        private readonly IUsuarioApplicationService _usuarioService;
        private readonly ILocalAtendimentoApplicationService _localAtendimentoApplicationService;

        public AutenticacaoController(IAutenticacaoProvider autenticacaoProviderParam, 
                                      IUsuarioApplicationService usuarioService,
                                      ILocalAtendimentoApplicationService localAtendimentoApplicationService)
        {
            _autenticacaoProvider = autenticacaoProviderParam;
            _usuarioService = usuarioService;
            _localAtendimentoApplicationService = localAtendimentoApplicationService;
        }

        public ActionResult AcessoNegado()
        {
            return View();
        }

        public ActionResult EmConstrucao()
        {
            return View();
        }

        public ActionResult Login()
        {
            ViewBag.Autenticado = _autenticacaoProvider.Autenticado;
            //_autenticacaoProvider.UsuarioAutenticado.ListaLocalAtendimento = _localAtendimentoApplicationService.GetAll();

            AutenticacaoViewModel autenticacaoViewModel = new AutenticacaoViewModel()
            {
                ListaLocalAtendimento = _localAtendimentoApplicationService.GetAll()
            };

            return View(autenticacaoViewModel);
        }

        public ActionResult Logoff()
        {
            _autenticacaoProvider.Desautenticar();
            return RedirectToAction("Login");
        }

        [HttpPost]
        public ActionResult Entrar(AutenticacaoViewModel autenticacaoModel, string returnUrl)
        {
            @TempData["Mensagem"] = string.Empty;
            if (ModelState.IsValid)
            {
                string msgErro;
                if (_autenticacaoProvider.Autenticar(autenticacaoModel, out msgErro, autenticacaoModel.Grupo))
                {
                    if (string.IsNullOrEmpty(msgErro))
                    {
                        var user = _usuarioService.GetByLogin(autenticacaoModel.Login);
                        @TempData["USER"] = user.Nome;

                        if ((user.FlagSenhaPadrao == 0) && (user.FlagAtualizado != 0))
                        {
                            return Redirect(returnUrl ?? Url.Action("Index", "Home", new { id = 2 }));
                        }
                        return RedirectToAction("TrocarSenha", "Autenticacao");
                    }
                    @TempData["Mensagem"] = msgErro;
                    @TempData["USER"] = "Visitante";
                    return RedirectToAction("Login", "Autenticacao");
                }
                @TempData["Mensagem"] = msgErro;
                return RedirectToAction("Login", "Autenticacao");
            }
            @TempData["Mensagem"] = "Preencha todos os campos para logar.";
            return RedirectToAction("Login", "Autenticacao");
        }

        public ActionResult TrocarSenha()
        {
            UsuarioViewModel user = _usuarioService.GetById(_autenticacaoProvider.UsuarioAutenticado.UsuarioId);
            return View(user);
        }

        public ActionResult RecuperarSenha(string Id)
        {
            if (Id == null) throw new ArgumentNullException("Id");
            const int id = 1; // Convert.ToInt32(CodeUtils.Decrypt(Id));
            var user = _usuarioService.GetById(id);
            return View(user);
        }

        [HttpGet]
        public ActionResult AtualizarSenha(string id, string senha)
        {
            try
            {
                UsuarioViewModel user = _usuarioService.GetById(Convert.ToInt32(id));
                user.Senha = CodeUtils.Encrypt(senha);
               _usuarioService.Update(user);
                @TempData["Mensagem"] = "Senha alterada com sucesso!.";
                return RedirectToAction("Login");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public ActionResult EsqueceuSenha(string login)
        {
            try
            {
                UsuarioViewModel user = _usuarioService.GetByLogin(login);

                if (user != null)
                {
                    var link = "www.funerariasantacruzjf.com.br/Autenticacao/RecuperarSenha?Id=" + 1;
                    var strMsg = @" Este e-mail é automático, não precisa responder. <br />
                                Você solicitou a troca da sua senha no nosso Sistema, se não foi você, <br />
                                favor ignorar este e-mail, mas se realmente quiser trocar sua senha, <br />
                                Clique no Link abaixo: <br /> " + link;

                    CodeUtils.EnviarEmail("Recuperação de Senha", user.Email, strMsg);
                    @TempData["Mensagem"] = "Você receberá um e-mail com o link da troca da senha.";
                }
                else
                {
                    @TempData["Mensagem"] = "E-mail inexistente na base de dados!";
                }
                
                return RedirectToAction("Login");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

    }
}